﻿#pragma once

#include "ISistema.h"
#include "Puntero.h"
#include "Hash.h"
#include "Pais.h"
#include "Mapa.h"
class Sistema : public ISistema
{
public:
	Sistema(int maxPaises, int maxCiudades, int maxRecursos);
	virtual ~Sistema();

	//// Obligatorio 1
	TipoRetorno AltaPais(Cadena nombrePais);
	TipoRetorno AltaCiudad(Cadena nombrePais, Cadena nombreCiudad, bool esCapital);
	TipoRetorno AltaRecurso(Cadena nombrePais, Cadena nombreCiudad, Cadena recurso, int puntaje, int cantidad, int valor);
	Tupla<TipoRetorno, Puntero<Iterador<pPais>>> ImprimirJuego() const;
	Tupla<TipoRetorno, pRecurso> RecursoMasValioso(Cadena nombrePais, Cadena nombreCiudad);
	Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> CiudadesRecurso(Cadena recurso) const;

	//// Tipo 1
	TipoRetorno AltaCamino(Cadena nombrePaisO, Cadena nombreCiudadO, Cadena nombrePaisD, Cadena nombreCiudadD, int distancia, int costo);
	TipoRetorno ListadoMapa(Cadena nombrePais, Cadena nombreCiudad) const;
	TipoRetorno Importar2(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int cantidad);
	Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> RutaMasRapida(Cadena nombrePaisO, Cadena nombreCiudadO, Cadena nombrePaisD, Cadena nombreCiudadD) const;
	Tupla<TipoRetorno, Puntero<Iterador<pRecurso>>> SeleccionRecurso(Cadena nombrePais, Cadena nombreCiudad, int k) const;

	//// Tipo 2
	Tupla<TipoRetorno, bool> Conectividad() const;
	TipoRetorno ConexionBarata(Puntero<Iterador<Tupla<pPais,pCiudad>>> ciudades) const;
	Tupla<TipoRetorno, Puntero<Iterador<Tupla<pPais,pCiudad>>>> Recolectar(Cadena nombrePais, Cadena nombreCiudad, Cadena nombreRecurso, int k) const;
	Tupla<TipoRetorno, Puntero<Iterador<Puntero<Iterador<Tupla<pPais,pCiudad>>>>>> RutasEntre2Paises(Cadena nombrePaisO, Cadena nombrePaisD) const;

	//// Opcionales
	Tupla<TipoRetorno, int> ValorMapa() const;
private:
	Puntero<Hash<Cadena,Puntero<Pais>>> hashPaises;
	Puntero<AVLImp<Puntero<Pais>>> avlPaises;
	Puntero<Hash<Puntero<Recurso>,Puntero<ListaImp<Puntero<Tupla<Puntero<Pais>,Puntero<Ciudad>>>>>>> hashRecOrdCron;
	Puntero<Mapa> mapa;
	int maxPais;
	int maxCiudades;
	int maxRecursos;
};
